/**
 * 在事务内创建流程的业务单据和流程实例
 *
 * 输入参数:
 *    与CardW相同
 *
 * 输出参数:
 *    与CardW相同, record会增加流程实例相关字段
 */
(() => {
  // 私有区域
  function Create({ UID, Card, Model, Record, Records }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");
    if (!Card) throw Error("Card参数不可以为空");

    Records = Records ?? [Record];

    // 事务中完成数据保存和流程创建。事务采用MP连接
    return A.db.trans('MP', () => {
      // 先保存好业务数据
      if (Model && !Model.includes('流程实例')) Model.push('流程实例');
      Records.forEach(record => {
        record.流程实例 = record.流程实例 || A.guid();  // 先指定实例ID，避免因空值导致保存失败
      });
      const results = A.job.CardW({ UID, Card, Model, Records });

      // 保存后的记录，逐条进行流程处理
      results.forEach(({ record, create_mode }) => {
        // 只有新增记录时才会创建流程
        if (create_mode) {
          const record_ex = A.card(Card).load(record.ID);
          // 根据卡片加载流程定义
          const v_card = A.card[Card];
          const workflow = A.job['B.Flow_LoadDefinition']({ UID, CardID: v_card.ID, record: record_ex });

          // 创建流程实例
          A.card['B.流程实例'].save({
            ID: record.流程实例,
            数据记录: record.ID,
            结束标记: false,
            流程定义: workflow.ID,
            当前节点: workflow.start.ID,
            最新记录: null
          }, UID);

          // 创建发起人待办任务
          A.card['B.流程待办'].save({
            流程实例: record.流程实例,
            待办用户: UID,
            描述: workflow.start.onGetDesc({ UID, record: record_ex }),
            发起用户: UID,
            发起日期: new Date(),
          }, UID);

          // 补充返回的流程信息
          record['流程实例.当前节点'] = workflow.start.ID;
        }
      });

      return results;
    });
  };

  return (arg1, arg2, arg3, arg4) => {
    if (typeof arg1 === 'string' && typeof arg2 === 'string') {
      let records = [];
      if (Array.isArray(arg4)) {
        records = arg4;
      } else {
        records.push(arg4);
      }
      return Create({
        UID: arg1,
        Card: arg2,
        Model: arg3,
        Records: records,
      });
    } else {
      return Create(arg1);
    }
  };
})()